-- websocket_client.lua - WebSocket客户端模块
-- 功能说明：处理设备端与中控端的WebSocket通信和指令处理
-- 主要功能：
--   1. 接收并处理中控端发送的控制指令
--   2. 支持的指令：wild(野外挂机), daily_task(日程安排), daily_mission(每日任务)
--   3. 管理脚本执行状态 (启动、停止、暂停、恢复)
-- 命名约定：dailyTask = 日程安排, dailyMission = 每日任务
-- 注意：此模块现在使用插件端的WebSocket连接，不再自己建立连接

local websocket_client = {}

-- 配置
local SERVER_HOST = "156.239.252.33"
local SERVER_PORT = 39003
local is_connected = false
local current_user_id = nil
local current_device_id = nil

-- 插件事件监听器（内部函数，避免与myMain.lua中的setPluginEvent冲突）
function websocket_client.handle_plugin_event(what, arg)
    print("[WEBSOCKET] 收到插件事件: what=" .. tostring(what) .. ", arg=" .. tostring(arg))
    
    if what == 0 then
        -- 插件转发给脚本的WebSocket消息
        websocket_client.handle_plugin_message(arg)
    end
end

-- 处理插件转发的WebSocket消息
function websocket_client.handle_plugin_message(message)
    print("[WEBSOCKET] 处理插件转发的消息: " .. tostring(message))
    
    -- 尝试解析JSON消息
    local decode_success, result = false, nil
    
    -- 使用懒人精灵自带的jsonLib
    if jsonLib and jsonLib.decode then
        decode_success, result = pcall(jsonLib.decode, message)
    end
    
    if decode_success and result then
        print("[WEBSOCKET] JSON解析成功，消息类型: " .. tostring(result.type))
        
        if result.type == "control_command" then
            print("[WEBSOCKET] 收到控制指令推送: " .. tostring(result.control_action))
            -- 调用控制指令处理函数
            websocket_client.handle_control_command(result.control_action)
            return
        elseif result.type == "config_files" then
            print("[WEBSOCKET] 收到配置文件推送，文件数量: " .. tostring(result.files and #result.files or 0))
            -- 调用配置文件处理函数
            websocket_client.handle_config_files(result.files)
            return
        elseif result.type == "config_update" then
            print("[WEBSOCKET] 收到配置更新推送")
            -- 调用配置文件处理函数
            websocket_client.handle_config_files(result.files)
            return
        else
            print("[WEBSOCKET] 未知的消息类型: " .. tostring(result.type))
        end
    else
        print("[WEBSOCKET] JSON解析失败，消息内容: " .. tostring(message))
        print("[WEBSOCKET] 处理原始消息")
    end
    
    -- 处理其他类型的消息
    print("[WEBSOCKET] 处理其他消息: " .. tostring(message))
end

-- 发送数据到服务器（通过插件）
function websocket_client.send(data)
    if not data then
        print("[WEBSOCKET] 发送数据为空")
        return false
    end
    
    local message = ""
    if type(data) == "string" then
        message = data
    else
        -- 尝试将数据转换为JSON字符串
        if jsonLib and jsonLib.encode then
            local encode_success, json_str = pcall(jsonLib.encode, data)
            if encode_success then
                message = json_str
            else
                print("[WEBSOCKET] JSON编码失败: " .. tostring(json_str))
                return false
            end
        else
            print("[WEBSOCKET] 没有可用的JSON编码器")
            return false
        end
    end
    
    print("[WEBSOCKET] 通过插件发送消息: " .. message)
    
    -- 通过插件发送消息到服务器
    -- 使用sendPluginEvent(0, message)发送消息给插件
    if sendPluginEvent then
        local result = sendPluginEvent(0, message)
        if result == "ok" then
            print("[WEBSOCKET] 消息发送成功")
            return true
        else
            print("[WEBSOCKET] 消息发送失败: " .. tostring(result))
            return false
        end
    else
        print("[WEBSOCKET] 无法访问插件服务，sendPluginEvent函数不存在")
        return false
    end
end

-- 发送连接请求（通常由插件端处理，脚本端保留此函数以备需要时使用）
function websocket_client.send_connect()
    print("[WEBSOCKET] 发送connect消息（脚本端）")
    
    -- 获取设备ID
    if not current_device_id then
        if sendPluginEvent then
            current_device_id = sendPluginEvent(5, "getDeviceld") or "unknown"
            print("[WEBSOCKET] 获取设备ID: " .. tostring(current_device_id))
        else
            print("[WEBSOCKET] 无法获取设备ID")
            return false
        end
    end
    
    local connect_data = {
        type = "connect",
        device_id = current_device_id
    }
    
    print("[WEBSOCKET] connect数据: type=" .. tostring(connect_data.type) .. ", device_id=" .. tostring(connect_data.device_id))
    
    return websocket_client.send(connect_data)
end

-- 发送登录请求（通常由插件端处理，脚本端保留此函数以备需要时使用）
function websocket_client.send_login_request()
    print("[WEBSOCKET] 发送login消息（脚本端）")
    
    -- 获取设备ID
    if not current_device_id then
        if sendPluginEvent then
            current_device_id = sendPluginEvent(5, "getDeviceld") or "unknown"
            print("[WEBSOCKET] 获取设备ID: " .. tostring(current_device_id))
        else
            print("[WEBSOCKET] 无法获取设备ID")
            return false
        end
    end
    
    -- 获取用户信息
    local username = ""
    if sendPluginEvent then
        username = sendPluginEvent(3, "username") or ""
    end
    
    local login_data = {
        type = "login",
        device_id = current_device_id,
        username = username
    }
    
    print("[WEBSOCKET] login数据: type=" .. tostring(login_data.type) .. ", device_id=" .. tostring(login_data.device_id) .. ", username=" .. tostring(login_data.username))
    
    return websocket_client.send(login_data)
end

-- 控制指令处理函数
function websocket_client.handle_control_command(control_action)
    print("[WEBSOCKET] 处理控制指令: " .. tostring(control_action))
    
    local config = require('Config/config')
    
    if control_action == "wild" then
        print("[WEBSOCKET] 执行开始野外挂机指令")
        config.execution_mode = "wild"
        config.gameState = config.State.LOGIN
        _G.restart_script_execution()
    elseif control_action == "daily_task" then
        print("[WEBSOCKET] 执行开始日程安排指令")
        config.execution_mode = "daily_task"
        config.gameState = config.State.DAILY_TASK
        _G.restart_script_execution()
    elseif control_action == "daily_mission" then
        print("[WEBSOCKET] 执行开始每日任务指令")
        config.execution_mode = "daily_mission"
        config.gameState = config.State.DAILY_MISSION
        _G.restart_script_execution()
    elseif control_action == "stop" then
        print("[WEBSOCKET] 执行停止脚本指令")
        config.execution_mode = "stopped"
        config.gameState = config.State.END
        _G.stop_script_execution()
    elseif control_action == "pause" then
        print("[WEBSOCKET] 执行暂停脚本指令")
        config.execution_mode = "paused"
        _G.pause_script_execution()
    elseif control_action == "resume" then
        print("[WEBSOCKET] 执行继续脚本指令")
        if config.execution_mode == "paused" then
            config.execution_mode = "running"
            _G.resume_script_execution()
        end
    elseif control_action == "screenshot" then
        print("[WEBSOCKET] 执行截图指令")
        _G.take_screenshot()
    elseif control_action == "find" then
        print("[WEBSOCKET] 执行查找设备指令")
        _G.find_device()
    else
        print("[WEBSOCKET] 未知的控制指令: " .. tostring(control_action))
    end
end

-- 配置文件处理函数
function websocket_client.handle_config_files(files)
    print("[WEBSOCKET] 处理配置文件推送")
    
    if not files or type(files) ~= "table" then
        print("[WEBSOCKET] 配置文件数据无效")
        return
    end
    
    -- 计算文件数量
    local file_count = 0
    for _ in pairs(files) do
        file_count = file_count + 1
    end
    print("[WEBSOCKET] 文件数量: " .. tostring(file_count))
    
    -- 确保配置目录存在
    local config_dir = "/sdcard/懒人精灵"
    local dir_exists = io.open(config_dir, "r")
    if not dir_exists then
        print("[WEBSOCKET] 创建配置目录: " .. config_dir)
        os.execute("mkdir -p " .. config_dir)
    else
        dir_exists:close()
    end
    
    local success_count = 0
    local fail_count = 0
    
    -- 逐个保存配置文件
    for filename, content in pairs(files) do
        if filename and content then
            local file_path = config_dir .. "/" .. filename
            print("[WEBSOCKET] 保存配置文件: " .. file_path)
            
            local file = io.open(file_path, "w")
            if file then
                file:write(content)
                file:close()
                print("[WEBSOCKET] 配置文件保存成功: " .. filename)
                success_count = success_count + 1
            else
                print("[WEBSOCKET] 配置文件保存失败: " .. filename)
                fail_count = fail_count + 1
            end
        else
            print("[WEBSOCKET] 跳过无效的配置文件: " .. tostring(filename))
            fail_count = fail_count + 1
        end
    end
    
    -- 显示保存结果
    local result_msg = "配置文件保存完成\n成功: " .. success_count .. " 个\n失败: " .. fail_count .. " 个"
    print("[WEBSOCKET] " .. result_msg)
    toast(result_msg)
    
    -- 通知配置加载器重新加载配置
    local config_loader = require('Config/config_loader')
    if config_loader and config_loader.reload_config then
        print("[WEBSOCKET] 通知配置加载器重新加载配置")
        config_loader.reload_config()
    end
end

-- 初始化WebSocket连接（现在只是初始化，不建立连接）
function websocket_client.connect()
    print("[WEBSOCKET] 初始化WebSocket客户端（使用插件端连接）")
    
    -- 获取设备ID
    if not current_device_id then
        if sendPluginEvent then
            current_device_id = sendPluginEvent(5, "getDeviceld") or "unknown"
            print("[WEBSOCKET] 获取设备ID: " .. tostring(current_device_id))
        else
            print("[WEBSOCKET] 无法获取设备ID")
            return false
        end
    end
    
    -- 插件端已经发送了connect和login消息，脚本端不需要重复发送
    print("[WEBSOCKET] 插件端已处理连接，脚本端跳过connect/login消息发送")
    
    is_connected = true
    print("[WEBSOCKET] WebSocket客户端初始化完成（使用插件端连接）")
    return true
end

-- 断开连接（现在只是标记断开，实际连接由插件管理）
function websocket_client.disconnect()
    print("[WEBSOCKET] 标记WebSocket客户端断开")
    is_connected = false
    print("[WEBSOCKET] WebSocket客户端已断开（实际连接由插件管理）")
end

-- 检查连接状态
function websocket_client.is_connected()
    return is_connected
end

-- 获取当前设备ID
function websocket_client.get_device_id()
    return current_device_id
end

-- 设置设备ID
function websocket_client.set_device_id(device_id)
    current_device_id = device_id
    print("[WEBSOCKET] 设置设备ID: " .. tostring(device_id))
end

return websocket_client 